home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / source / demostu2 / tunnel1.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-10-28  |  4.1 KB  |  246 lines

  1. program MegaDotTunnel;
  2. {
  3.     DotTunnel1
  4.     - by Bjarke Viksoe
  5.     around mar 1994
  6.  
  7.     All tunnel coords are precalculated, but centered around (0,0).
  8.     We can then draw each circle but with a new origo.
  9.     Screen mode is $13. Sorry. This source is rather old.
  10. }
  11.  
  12. uses
  13.     DEMOINIT;
  14.  
  15. const
  16.     antalringe = 256;
  17.     antaldots = 32;
  18.     ringspace = 4;
  19.     showantal = antalringe DIV ringspace;
  20.     ialt = showantal*antaldots;
  21.  
  22. type
  23.     bufferpointer = ^coordbuffer;
  24.     coordbuffer = array [1..antalringe, 1..antaldots] of integer;
  25.  
  26. var
  27.     oldmode, oldpage : shortint;
  28.     sinustabel        : array[0..639] of integer;
  29.     oldcoordbuffer    : array[1..ialt] of integer;
  30.     vinkel            : integer;
  31.     i,j                : integer;
  32.  
  33.     twist                : boolean;
  34.     xpos, ypos        : word;
  35.     ringpos            : word;
  36.     bufferptr         : bufferpointer;
  37.  
  38.  
  39. (*-----------------------------------------------------------*)
  40.  
  41. procedure OpenScreen;
  42. var
  43.     i, color : integer;
  44. begin
  45.     asm
  46.     mov     ah,$0F
  47.     int     $10
  48.     mov     oldmode,al
  49.  
  50.     mov     al,$13
  51.     xor     ah,ah
  52.     int     $10
  53.     end;
  54.  
  55.      color := 64;
  56.      for i:=1 to 64 do begin
  57.         SetRGB(i, color,color,color);
  58.         dec(color);
  59.      end;
  60. end;
  61.  
  62. procedure CloseScreen;
  63. begin
  64.       asm
  65.      mov    al,oldmode
  66.      xor    ah,ah
  67.      int    $10
  68.      end;
  69. end;
  70.  
  71.  
  72. (*-----------------------------------------------------------*)
  73.  
  74. procedure setupsinus;
  75. var
  76.     i : integer;
  77.     v, vadd : real;
  78. begin
  79.     for i:=1 to ialt do
  80.         oldcoordbuffer[i]:=0;
  81.  
  82.     v:=0.0;
  83.     vadd:=(2.0*pi/512.0);
  84.     for i:=0 to 639 do begin
  85.         sinustabel[i]:=round(sin(v)*32767);
  86.         v:=v+vadd;
  87.     end;
  88. end;
  89.  
  90.  
  91. procedure CalcCircler;
  92. var
  93.     i,j                    : integer;
  94.     v,vtemp,vadd        : word;
  95.     vinkel1, vinkel2    : integer;
  96.     x,y                    : longint;
  97.     cx,cy                : longint;
  98. begin
  99.  
  100.     x := 350;
  101.     y := 0;
  102.  
  103.     v := 0;
  104.     vadd := 512 DIV antaldots;
  105.     for i:=1 to antalringe do
  106.     begin
  107.           vtemp := v;
  108.         for j:=1 to antaldots do
  109.         begin
  110.             vinkel1:=sinustabel[vtemp];
  111.             vinkel2:=sinustabel[vtemp+128];
  112.             cx := (x*vinkel2 - y*vinkel1) DIV 32768;
  113.             cy := (x*vinkel1 + y*vinkel2) DIV 32768;
  114.             cx := (cx shl 8) DIV 800;
  115.             cy := (cy shl 8) DIV 800;
  116.  
  117.             if (cy<-100) OR (cy>100) then
  118.                 cy:=104;
  119.  
  120.             bufferptr^[i,j] := (cy*320)+cx;
  121.             vtemp := (vtemp+vadd) mod 512;
  122.         end;
  123.         inc(v);
  124.         dec(x,1);
  125.     end;
  126. end;
  127.  
  128. (*-----------------------------------------------------------*)
  129.  
  130.  
  131. procedure RestoreBackground;
  132. begin
  133.     asm
  134.         lea        si,oldcoordbuffer
  135.         mov        ax,$A000
  136.         mov        es,ax
  137.         xor        ax,ax
  138.         mov        cx,ialt
  139. @loop:
  140.         mov        bx,[si]
  141.         mov        [es:bx],al
  142.         inc        si
  143.         inc        si
  144.         loop    @loop
  145.     end;
  146. end;
  147.  
  148.  
  149. procedure DotTunnel(scrpos : integer; color : byte; ring : integer;
  150.                     bufferadd : integer);
  151. begin
  152.     ring := ring*(antaldots*2);
  153.  
  154.     asm
  155.         mov    ax,$A000
  156.         mov    es,ax
  157.  
  158.         lea    di,oldcoordbuffer
  159.         add   di,bufferadd
  160.         mov    dx,scrpos
  161.         mov    cl,color
  162.  
  163.         mov    ax,WORD PTR bufferptr+2
  164.         mov    si,WORD PTR bufferptr
  165.         add    si,ring
  166.         {mov    fs,ax} DB $8E,$E0
  167.  
  168.         mov    al,cl
  169.         mov    cx,antaldots
  170. @dotloop:
  171.         DB FS; mov bx,[si]
  172.         add    bx,dx
  173.         mov    [es:bx],al
  174.         inc    si
  175.         inc    si
  176.         mov    [ds:di],bx
  177.         inc    di
  178.         inc    di
  179.         loop    @dotloop
  180.     end;
  181.  
  182. end;
  183.  
  184.  
  185.  
  186. procedure TunnelSteering;
  187. var
  188.     i                : integer;
  189.     tempx, tempy    : word;
  190.     ringnr            : word;
  191.     bufferadd        : integer;
  192.     x,y,z            : integer;
  193. begin
  194.     tempx := xpos; tempy := ypos;
  195.     z := 7500;
  196.     ringnr := ringpos;
  197.     bufferadd := 0;
  198.  
  199.     for i:=1 to showantal do
  200.     begin
  201.         x := 160+(sinustabel[tempx mod 512] DIV z);
  202.         y := 100+(sinustabel[tempy mod 512] DIV z);
  203.         DotTunnel(y*320+x, i, ringnr, bufferadd);
  204.         dec(z,115);
  205.         inc(tempx,4); inc(tempy,3);
  206.         inc(ringnr,ringspace);
  207.         inc(bufferadd,antaldots*2);
  208.     end;
  209.  
  210.     twist := NOT twist;
  211.     if (twist) then
  212.         ringpos := (ringpos+1) mod ringspace
  213. end;
  214.  
  215.  
  216. procedure go;
  217. begin
  218.     VBLANK_QUICK;
  219.     RestoreBackground;
  220.     TunnelSteering;
  221. end;
  222.  
  223.  
  224. (*-----------------------------------------------------------*)
  225.  
  226. begin
  227.     SetupSinus;
  228.     new(bufferptr);
  229.     CalcCircler;
  230.     OpenScreen;
  231.  
  232.     twist := TRUE;
  233.     xpos := 0; ypos := 0;
  234.     ringpos := 0;
  235.  
  236.     for i:=1 to 500 do begin
  237.         go;
  238.         dec(xpos,2);
  239.         inc(ypos,1);
  240.     end;
  241.  
  242.     CloseScreen;
  243.     dispose(bufferptr);
  244. end.
  245.  
  246.